#include "hx711.h"
#include "stdio.h"
#include "stdint.h"
#include "gpio.h"

#define KEY_RESET() HAL_GPIO_ReadPin(KEY_RESET_GPIO_Port, KEY_RESET_Pin)
#define KEY_UP() HAL_GPIO_ReadPin(KEY_UP_GPIO_Port, KEY_UP_Pin)
#define KEY_DOWN() HAL_GPIO_ReadPin(KEY_DOWN_GPIO_Port, KEY_DOWN_Pin)

int32_t weight_qupi = 0;  // 获取毛皮重量
int32_t weight_shiji = 0; // 每次读取的实际值

#define G_DEF (420u)

int32_t GapValue = G_DEF;
/********************************************************************************************************
GapValue：
420对应的是5kg量程传感器的参数值。
1kg量程在2100左右，3kg量程在750左右，5kg量程在430左右，10kg量程在210左右，20kg在110左右。
测量结果偏大，增加改值进行校准，如果测试出来的重量偏小时，减小改数值，该值可以为小数。
********************************************************************************************************/

// 读取HX711
uint32_t ReadCount(void)
{
	uint32_t Count = 0;
	uint8_t ii = 0;

	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);

	// while(HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin));
	while (1)
	{
		if (HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin) == 0)
		{
			HAL_Delay(1);
			if (HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin) == 0)
			{
				break;
			}
		}
		ii++;
		if (ii >= 1000000)
		{
			break;
		}
	}
	HAL_Delay(1);

	for (int i = 0; i < 24; i++)
	{
		HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
		Count = Count << 1;
		HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
		if (HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin) == 1)
			Count++;
	}

	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
	HAL_Delay(2);
	Count = Count ^ 0x800000;
	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
	return (Count);
}

// 获取毛皮重量
void Get_Maopi(void)
{
	weight_qupi = (int32_t)ReadCount();
}

// 获取实际的重量
int32_t WeightReal(void)
{
	weight_shiji = ReadCount();
	weight_shiji = weight_qupi - weight_shiji;
	weight_shiji = (int32_t)((float)weight_shiji / (float)GapValue);
	return weight_shiji;
}

void hx711_entry(void)
{
	if (KEY_RESET() == 0)
	{
		HAL_Delay(50);
		if (KEY_RESET() == 0)
		{

			Get_Maopi(); // 去皮
			printf("KEY_RESET\n");
		}
	}
	if (KEY_UP() == 0)
	{
		printf("KEY_UP\n");
		HAL_Delay(50);
		if (KEY_UP() == 0)
		{
			if (GapValue > 0U)
			{
				GapValue--;
				printf("%d\n", GapValue);
			}
		}
	}
	if (KEY_DOWN() == 0)
	{
		printf("KEY_DOWN\n");
		HAL_Delay(50);
		if (KEY_DOWN() == 0)
		{
			if (GapValue < 2000U)
			{
				GapValue++;
				printf("%d\n", GapValue);
			}
		}
	}
}
